#include<iostream>
using namespace std;
#include<unistd.h>
#include<string>
#include<pthread.h>
#include<string.h>
#include<errno.h>

__thread  int g_val = 100;

//将传过来的tid转为字符串
string get_tid(const pthread_t& tid){
    char tids[64];
    snprintf(tids,sizeof tids,"tid:0x%x",tid);//这里应该是把tid给写入
    return tids;
}

void* start_routine(void* args){
    string name = static_cast<const char*>(args);
    while(true){
        //获取新线程的id:pthread_self()

        //进行线程的分离
        //pthread_detach(pthread_self());//分离了新线程
        //cout<<"我是新线程,名称："<<name<<get_tid(pthread_self())<<endl;//验证：这里的新线程的tid应该和主线程创建新线程的返回值是一样的

        cout<<"我是新线程，我的tid是:"<<get_tid(pthread_self())<<":g_val:"<<g_val<<"&g_val:"<<&g_val<<endl;

        sleep(1);
        g_val++;
    }
}

//1：测试线程分离，使用了线程分离就不用join，如果使用了join，会返回错误码
int main(){
    pthread_t tid;
    pthread_create(&tid,nullptr,start_routine,(void*)"thread 1");

    //线程分离我们一般放到主线程来进行，这样就不怕主线程直接去等待了
    //pthread_detach(tid);
    //cout<<"我是主线程，创建的新线程的返回值是:"<<get_tid(tid)<<endl;

    pthread_t ret = pthread_self();
    cout<<"我是主线程，我的tid是:"<<get_tid(ret)<<":g_val:"<<g_val<<"&g_val:"<<&g_val<<endl;

    int n = pthread_join(tid,nullptr);//第一个参数是要等待的新线程的id
    //如果设置了分离状态，不能进行等待了，会返回错误码
    cout<<"result:"<<n<<":"<<strerror(n)<<endl;


    return 0;
}
